<?php

namespace App\Utils;

use Illuminate\Http\UploadedFile;
use Illuminate\Support\Str;

class UploadUtil
{
    /**
     * 允许的图片类型
     */
    const ALLOWED_IMAGE_TYPES = ['jpg', 'jpeg', 'png', 'gif', 'webp'];
    
    /**
     * 最大图片大小（5MB）
     */
    const MAX_IMAGE_SIZE = 5 * 1024 * 1024;
    
    /**
     * 上传图片
     * @param UploadedFile $file 上传的文件
     * @param string $directory 存储目录
     * @return array 上传结果
     * @throws \Exception
     */
    public static function uploadImage(UploadedFile $file, string $directory = 'images'): array
    {
        // 检查文件类型
        $extension = strtolower($file->getClientOriginalExtension());
        if (!in_array($extension, self::ALLOWED_IMAGE_TYPES)) {
            throw new \Exception('不支持的图片格式，仅支持：' . implode(', ', self::ALLOWED_IMAGE_TYPES));
        }
        
        // 在移动文件前获取文件信息
        $fileSize = $file->getSize();
        $fileMimeType = $file->getMimeType();
        $fileOriginalName = $file->getClientOriginalName();
        
        // 确保目录存在
        $uploadPath = storage_path('app/public/' . $directory . '/' . date('Ymd'));
        if (!file_exists($uploadPath)) {
            mkdir($uploadPath, 0755, true);
        }
        
        // 生成唯一文件名
        $filename = Str::uuid() . '.' . $extension;
        $relativePath = $directory . '/' . date('Ymd') . '/' . $filename;
        $fullPath = storage_path('app/public/' . $relativePath);
        
        // 移动上传文件
        if (!$file->move(dirname($fullPath), $filename)) {
            throw new \Exception('图片上传失败');
        }
        return [
            'path' => $relativePath,
            'url' => self::url($relativePath),
            'size' => $fileSize,
            'mime_type' => $fileMimeType,
            'original_name' => $fileOriginalName
        ];
    }

    /**
     * 生成图片URL
     * @param string $filePath 文件路径
     * @return string 图片URL
     */
    public static function url(string $filePath): string
    {
        // 如果是http开头的，直接返回
        if (strpos($filePath, 'http') === 0) {
            return $filePath;
        }
        $baseUrl = env('IMG_URL', 'http://img.members.com');
        return $baseUrl. '/'. $filePath;
    }

    /**
     * 截取url中的path
     * @param string $url
     * @return string
     */
    public static function getPathFromUrl(string $url): string
    {
        $baseUrl = self::url('');
        
        // 如果URL以基础URL开头，则移除基础URL部分
        if (strpos($url, $baseUrl) === 0) {
            $path = substr($url, strlen($baseUrl));
            // 移除开头的斜杠（如果有）
            return ltrim($path, '/');
        }
        
        // 如果不是以基础URL开头，尝试解析URL并提取路径部分
        $parsedUrl = parse_url($url);
        if (isset($parsedUrl['path'])) {
            return ltrim($parsedUrl['path'], '/');
        }
        
        // 如果无法解析，则返回原始URL
        return $url;
    }
}